package gin

import (
	"strings"
)

// 支持westful风格 以及 全匹配
// /xxx/xxx/:id/:name/:
// /xxx/*


type root struct {
	pattern string
	// * 表示匹配全部 :id 这种表示
	val string
	sons []*root
	isWild bool
}

func newRoot() *root {
	return &root{}
}

func (r *root) add(s string) {
	p := strings.Split(s,"/")
	r.insert(p[1:],&s)
}

func (r *root) findAsS(s string) string {
	p := strings.Split(s,"/")
	return r.match(p[1:]).pattern
}

func (r *root) find(s string) *root {
	p := strings.Split(s,"/")
	return r.match(p[1:])
}

func (r *root) insert(s []string,pattern *string) {
	// 先查找sons中是不是存在这个范式
	son := r.findSon(s[0])
	// 没找到子节点
	if son==nil {
		nr := newRoot()
		nr.val = s[0]
		if nr.val == "*" || nr.val[0] == ':' {
			nr.isWild = true
		}
		r.sons = append(r.sons, nr)
		if len(s)>1 {
			nr.insert(s[1:],pattern)
		} else {
			nr.pattern = *pattern
		}
	} else if len(s)>1 {
		son.insert(s[1:],pattern)
	}
}

// 匹配最长的串---避免/home/*这种把别人都匹配了
func (r *root) match(s []string) *root {
	if len(s)==0 || (r.val=="*"&&len(s)>=1) {
		return r
	}
	sons := r.findSons(s[0])
	var ans *root
	for i:=0;i<len(sons);i++ {
		n := sons[i].match(s[1:])
		if n != nil && (ans==nil || len(ans.val) < len(n.val)) {
			ans = n
		}
	}
	return ans
}

func (r *root) findSon(s string) *root {
	var ans *root
	for i:=0;i<len(r.sons);i++ {
		if 	r.sons[i].val == s {
			ans = r.sons[i]
		}
	}
	return ans
}

func (r *root) findSons(s string) []*root {
	ans := make([]*root,0)
	for i:=0;i<len(r.sons);i++ {
		if 	r.sons[i].val == s || r.sons[i].isWild {
			ans = append(ans, r.sons[i])
		}
	}
	return ans
}